package shinesend.com.cn.mediaplayerdemo;

import android.media.AudioManager;
import android.media.MediaPlayer;
import android.os.SystemClock;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.widget.EditText;
import android.widget.SeekBar;
import android.widget.TextView;
import android.widget.Toast;

import java.io.IOException;
/*
从细节分析mediaPlayer的使用;
开始,暂停,停止,重新开始;
播放
 */
public class MainActivity extends AppCompatActivity implements SeekBar.OnSeekBarChangeListener, MediaPlayer.OnCompletionListener {

    private EditText edtext;
    //资源路径
    private String path;
    //多媒体
    private MediaPlayer mediaPlayer;
    //状态
    private final int IDLING = 0; // 空闲中
    private final int PLAYING = 1; // 播放中
    private final int PAUSING = 2; // 暂停中
    private final int STOPPING = 3; // 停止中
    //当前播放器的状态
    private  int currentState = IDLING;//默认是出于空闲状态的;
    //进度条
    private SeekBar seekBar;
    //是否停止正在更新的任务.当
    private boolean isStop = false;
    // 是否正在拖动进度条中.
    private boolean isTrackingTouch = false;
    //当前时间
    private TextView tv_current_time;
    //总共时间
    private TextView tv_total_time;
    //播放界面
    private SurfaceView surfaceview;
    private SurfaceHolder sh;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initView();
    }

    private void initView(){
        edtext = (EditText) findViewById(R.id.et_music_path);
        seekBar = (SeekBar) findViewById(R.id.sb_progress);
        //设置监听---->>>>拖动监听;
        seekBar.setOnSeekBarChangeListener(this);
        tv_current_time = (TextView) findViewById(R.id.tv_current_time);
        tv_total_time = (TextView) findViewById(R.id.tv_total_time);
        //surfaceview 是一个双缓冲的控件;先缓冲在播放,使界面流畅;
        surfaceview = (SurfaceView) findViewById(R.id.surfaceview);
         sh = surfaceview.getHolder();
        //设置surfaceView不使用自己的双缓冲区,而是使用其他的对象推送给他;
        //在4.0以前可以设置,以后可以不设置
        sh.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);


    }

    //开始,注意开始有两种的起点:1>是从空闲状态下开始2>是从暂停的状态的情况下开始;
    //如果是从1,播放器就必须准备好才能开始,如果2可以直接开始;
    public void start(View view){
        //注意:如果不为null也有两种情况;
        // 1.是在暂停的状态.如果是暂停:可以直接登录
        // 2.是在stop的状态下;如果是stop状态的的化
        if (mediaPlayer!=null){
            if (currentState==PAUSING){
                mediaPlayer.start();
                //改变状态
                currentState=PLAYING;//播放状态
                isStop = false;//没有播放
                return;
            }else if(currentState==STOPPING){
                //重置
                mediaPlayer.reset();
                //释放;
                mediaPlayer.release();
            }
        }
        //开始播放;
        play(true);
    }

    //暂停
    public void pause(View view){
        //只有在播放的情况下才可以暂停;
        if (mediaPlayer!=null&&currentState!=PLAYING)
        mediaPlayer.pause();
        currentState=PAUSING;
        //是正在暂停;
        isStop = true;
    }

    //停止,
    //归根到底可以在任何的情况下都可以停止,也就是mediaPlayer不得空的时候
    public void stop(View view){
        if (mediaPlayer!=null){
            mediaPlayer.stop();
            currentState=STOPPING;
            isStop = true;
        }
    }

    //重新开始
    public void restart(View view){
        if (mediaPlayer!=null){
            //重置释放
            mediaPlayer.reset();
            mediaPlayer.release();
        }
        play(false);
    }

    //播放.也就是初始化;
    private void play(final boolean isStartThread){
        path = edtext.getText().toString();
        mediaPlayer = new MediaPlayer();
        //规定:
        //1.流的规定
        mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
        //2.被输出对象的规定
        mediaPlayer.setDisplay(sh);
        //设置监听
        mediaPlayer.setOnCompletionListener(this);
        //设置
        try {
            mediaPlayer.setDataSource(path);
            //如果是本地资源可以使用perpare 但是如果是网络资源,那就有延时的效果,需要异步准备;
            //mediaPlayer.prepare();
            mediaPlayer.prepareAsync();//异步准备
            mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {//准备完成后调用;
                @Override
                public void onPrepared(MediaPlayer mp) {
                    mediaPlayer.start();
                    //变化开始播放状态
                    currentState=PLAYING;
                    //获取最大的刻度值
                    int max = mediaPlayer.getDuration();//单位值毫秒值
                    //给seekbar设置最大值
                    seekBar.setMax(max);
                    //1.转化成秒
                    max = max/1000;
                    //2.获取分钟数
                    int m = max/60;
                    //3.得到秒数
                    int s = max%60;
                    //4.设置到tv上
                    tv_total_time.setText("/"+m+":"+s);
                    //
                    if (isStartThread){
                        isStop = false;
                        //设置一个线程,每一秒取值一次
                        new Thread(new UpdateProgressRunnable()).start();
                    }

                }
            });

        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    //进度条在改变的过程中
    @Override
    public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
        //更改在拖动进行时的状态;
        progress = progress / 1000;
        int m = progress / 60;
        int s = progress % 60;
        tv_current_time.setText(m + ":" + s);
    }

    //如果触摸开始的时候;;;;;;;
    @Override
    public void onStartTrackingTouch(SeekBar seekBar) {
        isTrackingTouch = true;
    }

    //当停止的时候
    @Override
    public void onStopTrackingTouch(SeekBar seekBar) {
        // 获得当前seekbar拖动的位置
        int progress = mediaPlayer.getCurrentPosition();
        //跳转到那个位置
        mediaPlayer.seekTo(progress);
    }

    //播放完的监听;
    @Override
    public void onCompletion(MediaPlayer mp) {
        Toast.makeText(this, "播放完成", Toast.LENGTH_LONG).show();
       mediaPlayer.start();
    }

    //更新进度条的任务类
    class UpdateProgressRunnable implements Runnable{
        @Override
        public void run() {
            while(true){
                //获得当前的值
                int currentTime = mediaPlayer.getCurrentPosition();
                //如果没有触摸seekbar的时候可以更新自己
                if (!isTrackingTouch){
                    //设置给seekbar,seekbar是可以在子线程中更新的,但是textVeiw不可以
                    seekBar.setProgress(currentTime);
                    currentTime = currentTime/1000;
                    final int m = currentTime / 60;
                    final int s = currentTime % 60;
                    //在主线程中更新
                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            tv_current_time.setText(m + ":" + s);
                        }
                    });
                }
                //休眠1s
                SystemClock.sleep(1000);
            }
        }
    }
}
